import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
import warnings
warnings.filterwarnings("ignore")
import plotly.express as px
import plotly.graph_objs as go
from IPython.display import HTML,display
from datetime import datetime
import plotly.express as px
import plotly.graph_objs as go
import plotly.offline as py

## 使用google浏览器打开jupyter浏览器，jupyter nbconvert --to html图片无法展示，出现plotlyjs 404，代码添加fig.show(renderer="notebook")，
## 运行完后，点击保存，获得检查点，然后在cmd再次运行jupyter nbconvert --to html，即可生成html文件，双击检查文件图偏是否正常显示

industry_level1_mapping = {'A': '农、林、牧、渔业',
                           'B': '采矿业',
                           'C': '制造业',
                           'D': '电力、热力、燃气及水生产和供应业',
                           'E': '建筑业',
                           'F': '批发和零售业',
                           'G': '交通运输、仓储和邮政业',
                           'H': '住宿和餐饮业',
                           'I': '信息传输、软件和信息技术服务业',
                           'J': '金融业',
                           'K': '房地产业',
                           'L': '租赁和商务服务业',
                           'M': '科学研究和技术服务业',
                           'N': '水利、环境和公共设施管理业',
                           'O': '居民服务、修理和其他服务业',
                           'P': '教育',
                           'Q': '卫生和社会工作',
                           'R': '文化、体育和娱乐业',
                           'S': '公共管理、社会保障和社会组织',
                           'T': '国际组织'}


def read_data(file_path):
    df = pd.read_csv(file_path)
    # 由于clickhouse导出的数据字段名带有t1.所以采用文本文件修改表名，并且在文本文件里面使用UTF-8编码整理csv文件，导致大部分字段变为str，后续字段需要进行运算需要修改字段的type
    return df


def data_clean(df):
    df["money"] = df["money"] / 100
    df["credit_line"] = np.where(df["credit_line"] > df["money"], df["credit_line"], df["money"])
    df = df.drop("money", axis=1)
    df["product_name"] = df["product_name"].map(lambda x: x.replace('（1）', '').replace('（2）', ''))
    df["label"] = np.where(df["credit_line"] > 0, 1, 0)
    df = df[df["credit_line"] > 0]
    # 获批企业，筛选出有授信额度的公司
    # 其实可以使用label字段进行筛选
    return df


def select_month(df, min_month, max_month):
    # 由于导入数据busi_time列格式是str，所以采用这个方法查询当月数据，无法使用逻辑运算符
    # df9=df[df["busi_time"].str.contains("2023/9")]
    min_month = str(min_month)
    max_month = str(max_month)
    # 如果要查询连续几月的可以转换busi_time为datetime格式然后就&运算获得结果
    df["busi_time"] = pd.to_datetime(df["busi_time"])
    # print(df["busi_time"].dtypes)
    df = df[(df["busi_time"] >= min_month) & (df["busi_time"] < max_month)]
    return df


def product_rank(df):
    df_product = df.groupby('product_name').agg({"company_name": "count"}).sort_values(by=["company_name"],
                                                                                       ascending=False)[
                 :5].reset_index()
    # 按照获批的产品数量，确定重点产品分析
    return df_product


def product_chart(df):
    df = df.rename(columns={'company_name': 'count'})
    # 计算获批产品所占百分比
    df['获批产品占比'] = df['count'].apply(lambda x: x / df['count'].sum() * 100)
    print(df)
    fig = px.bar(df, x="product_name", y="获批产品占比", color="product_name", title="获批贷款产品排名")
    fig.update_traces(texttemplate="%{y:.1f}%", textposition='outside')
    fig.show(renderer="notebook")
    # HTML(fig.to_html()) # to_html()
    # py.iplot(fig)


def industry_major_chart(df_level1, product_name):
    # 行业大类（一级）图表
    df_level1 = df[df['product_name'] == product_name].groupby('industry_main_code').agg({"company_name": "count"})
    # 行索引重命名匹配中文
    df_level1 = df_level1.rename(index=industry_level1_mapping, columns={'company_name': 'count'})
    # 按照行业大类统计公司数量
    df_level1 = df_level1.sort_values(by=["count"], ascending=False).reset_index()
    # 计算行业大类的所占百分比
    df_level1['行业大类授信占比'] = df_level1['count'].apply(lambda x: x / df_level1['count'].sum() * 100)

    fig = px.bar(df_level1, x="industry_main_code", y="行业大类授信占比", color="industry_main_code",
                 title="%s 行业大类柱状图" % product_name, )
    # 绘制占比标签
    fig.update_traces(texttemplate="%{y:.1f}%", textposition='outside')
    fig.update_traces(hovertemplate="行业占比:%{y:.1f}%")
    fig.show(renderer="notebook")
    # HTML(fig.to_html()) # to_html()


def industry_minor_chart(df, product_name, parent_code):
    # 行业小类（二级）图表
    df_level2 = df[
        (df['product_name'] == product_name) & (df['level'] == 2) & (df['parent_code'] == parent_code)].groupby(
        'industry').agg({"company_name": "count"})
    # 修改列名
    df_level2 = df_level2.rename(columns={'company_name': 'count'})
    df_level2 = df_level2.sort_values(by=["count"], ascending=False).reset_index()

    df_level2['行业小类授信占比'] = df_level2['count'].apply(lambda x: x / df_level2['count'].sum() * 100)

    parent_code_name = industry_level1_mapping.get(parent_code)
    print(product_name, parent_code_name)
    fig = px.bar(df_level2, x="industry", y="行业小类授信占比", color="industry",
                 title="%s %s行业柱状图" % (product_name, parent_code_name))
    # 绘制占比标签
    fig.update_traces(texttemplate="%{y:.1f}%", textposition='outside')
    fig.update_traces(hovertemplate="行业占比:%{y:.1f}%")
    fig.update_layout(xaxis=dict(tickangle=45))
    fig.show(renderer="notebook")
    # HTML(fig.to_html()) # to_html()
    # py.iplot(fig)


# 测试执行
file_path = r"C:\Users\DELL\Desktop\融资情报局\10月尝试\10月行业合集数据1.csv"
df = read_data(file_path)
df_clean = data_clean(df)
min_month = '2023-09-01'
max_month = '2023-11-01'
df9_10 = select_month(df_clean, min_month, max_month)
df_product = product_rank(df9_10)
product_chart(df_product)
for i, product_name in enumerate(df_product['product_name']):
    # 第一贷款产品top5二级行业分析
    if i == 0:
        print(product_name)
        df_level1 = industry_major_chart(df9_10, product_name)
        df_industry = df9_10[df9_10['product_name'] == product_name].groupby('industry_main_code').agg(
            {"company_name": "count"}).sort_values(by=["company_name"], ascending=False)[:5].reset_index()
        for j, parent_code in enumerate(df_industry['industry_main_code']):
            print(j, parent_code)
            industry_minor_chart(df9_10, product_name, parent_code)
    else:
        # 第2-4名贷款产品top1二级行业分析
        print(product_name)
        df_level1 = industry_major_chart(df9_10, product_name)
        df_industry = df9_10[df9_10['product_name'] == product_name].groupby('industry_main_code').agg(
            {"company_name": "count"}).sort_values(by=["company_name"], ascending=False)[:1].reset_index()
        print(df_industry)
        for industry_parent_code in df_industry['industry_main_code']:
            industry_minor_chart(df9_10, product_name, industry_parent_code)
